package com.azt.front.action.freemarker;
import com.azt.api.enums.UserFuncShowTypeEnum;
import com.azt.api.enums.UserFuncTypeEnum;
import com.azt.api.pojo.Company;
import com.azt.api.pojo.Role;
import com.azt.api.pojo.User;
import com.azt.api.pojo.UserFunction;
import com.azt.api.service.CompanyService;
import com.azt.api.service.FunctionService;
import com.azt.api.service.MsgUserService;
import com.azt.front.utils.ContextUtil;
import freemarker.core.Environment;
import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static freemarker.template.ObjectWrapper.DEFAULT_WRAPPER;

@Component("businessmenu_list")
public class BusinessMenu implements TemplateDirectiveModel {
    @Autowired
    private FunctionService functionService;
    @Autowired
    private MsgUserService msgUserService;
	@Autowired
	private CompanyService companyservice;
    /* (non Javadoc)
     * @Title: execute
     * @Description: 左侧权限菜单的模板
     * 业务需求:
     * 1:注册用户采购商和供应商的菜单全部列出来  只是没有权限先点击
     * 2:其他身份的用户根据他的roleId来列出菜单
     * @param env  系统环境变量，通常用它来输出相关内容，如Writer out = env.getOut();
     * @param params 自定义标签传过来的对象，其key=自定义标签的参数名，value值是TemplateModel类型，而TemplateModel是一个接口类型，通常我们都使用TemplateScalarModel接口来替代它获取一个String 值，如TemplateScalarModel.getAsString();当然还有其它常用的替代接口，如TemplateNumberModel获取number，TemplateHashModel等
     * @param loopVars  循环替代变量
     * @param body 用于处理自定义标签中的内容,如<@myDirective>将要被处理的内容</@myDirective>；当标签是<@myDirective />格式时，body=null 在body在解析的时候会先把参数放入env中
     * @throws TemplateException
     * @throws IOException
     * @see freemarker.template.TemplateDirectiveModel#execute(freemarker.core.Environment, java.util.Map, freemarker.template.TemplateModel[], freemarker.template.TemplateDirectiveBody)
     */
    @Override
    public void execute(Environment env, Map params, TemplateModel[] loopVars,
                        TemplateDirectiveBody body)
            throws TemplateException, IOException {
    	  Map parmap = new HashMap();
          User user = ContextUtil.getUser();
          Role currentRole = ContextUtil.getCurrentRole();
          int showType = DirectiveUtils.getInt("showType", params);//菜单的类别：左侧1顶部2
          parmap.put("User", user);
      
          String menucode=DirectiveUtils.getString("menucode", params);//菜单的code
          
          UserFunction parmenucode = functionService.getParFunByCode(menucode);//取当前页面的父级对象
          //父类的对象
          parmap.put("parmenucode", parmenucode);
          
          
        if (currentRole != null && user != null) {
        	/**
        	 * 如果当前是注册用户 列出所有的removed=0的采购商和供应商的全部菜单
        	 **/
        	
        	//用户公司是否审核通过
        	Company company=user.getCompany();
        	if(company!=null){
        		Company topCompany=companyservice.getTopParentCompany(company.getId());
        		parmap.put("topCompany", topCompany);
        	}
        	
        	List<UserFunction> parentAndChild=null;
        	if(parmenucode!=null && !"homePage".equals(parmenucode.getCode()) && parmenucode.getShowType().equals(UserFuncShowTypeEnum.TOP.getValue()) && UserFuncShowTypeEnum.LEFT.getValue()==showType){
        		//属于顶部元素的左侧菜单加载如此  //除了首页，其他头部点的都进
        		parentAndChild=functionService.loadChildMenuTree(company,currentRole,parmenucode.getId());
        	
        	}else{
        		parentAndChild=functionService.loadMenuTree(company,currentRole,UserFuncTypeEnum.MENU.getValue(),showType);//根据当前的ROLEID拿到权限菜单
        		parmap.put("homePage", "homePage");
        	}

        	if(showType == 2) {
                parmap.put("msgList", msgUserService.findHeadMsgCount(user.getId()));
            }

            parmap.put("parentmenu", parentAndChild);
            parmap.put("currentRole", currentRole);
            //全局
            env.setVariable("currentcompany",DEFAULT_WRAPPER.wrap(company));
        }
         
        DirectiveUtils.writer(parmap, env, params, body);
    }

}
